﻿// Inner Fire 游戏引擎库
// Shader - 着色器
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 用于载入着色器的配置信息
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-08

#include "shader.h"

namespace ifire::game {

ShaderDefine::ShaderDefine(const ikit::XmlNode& n)
    : name(n("Name")), value(n.Text()) {}

Shader::Shader(Assets* manager, const ikit::XmlNode& node)
    : Resource(manager, node("Name"))
    , filename(node("File"))
    , entry(node("Entry"))
    , target(node("Target"))
    , converted_(false), is_system(node("IsSystem")) {
  node.ReadItems("Define", defines_);
}

const D3D_SHADER_MACRO* Shader::GetD3DDefines() {
  // 如果没有配置，直接返回nullptr
  if (defines_.size() == 0) return nullptr;

  if (!converted_) {
    // 转换每个定义
    for (const auto& define : defines_) {
      D3D_SHADER_MACRO macro;
      macro.Name = define.name.c_str();
      macro.Definition = define.value.empty() ? nullptr : define.value.c_str();
      d3dDefines_.push_back(macro);
    }

    // 添加终止标记
    D3D_SHADER_MACRO terminator = {nullptr, nullptr};
    d3dDefines_.push_back(terminator);

    converted_ = true;
  }

  return d3dDefines_.data();
}
} // namespace ifire::game